package cn.brilliantfuture.commentry.util;

/**
 * G(X)=X^8+X^5+X^4+1
 */

public class CRC8 {

	public static String getCRC(String str) {
		return new String(Integer.toHexString(FindCRC(str.getBytes(), str.getBytes().length)))
				.toUpperCase();
	}
	
	public static String getCRC(String str, int poly) {
		return new String(Integer.toHexString(FindCRC(str.getBytes(), str.getBytes().length, poly)))
				.toUpperCase();
	}

	private static int FindCRC(byte[] data, int datalen) {
		int CRC = 0;
		int genPoly = 0xaa; // 注意此固定值
		for (int i = 0; i < datalen; i++) {
			CRC ^= data[i];
			for (int j = 0; j < 8; j++) {
				if ((CRC & 0x80) != 0x00)
					CRC = (CRC << 1) ^ genPoly;
				else
					CRC <<= 1;
			}
		}
		CRC &= 0xff;// 保证CRC余码输出为2字节。
		return CRC;
	}

	private static int FindCRC(byte[] data, int datalen, int genPoly) {
		int CRC = 0;
		for (int i = 0; i < datalen; i++) {
			CRC ^= data[i];
			for (int j = 0; j < 8; j++) {
				if ((CRC & 0x80) != 0x00)
					CRC = (CRC << 1) ^ genPoly;
				else
					CRC <<= 1;
			}
		}
		CRC &= 0xff;// 保证CRC余码输出为2字节。
		return CRC;
	}
}
